#ifndef SINGLETON_H
#define SINGLETON_H
#include <global.h>

// 单例类
template <typename T>

class Singleton{
protected:
    Singleton() = default;
    Singleton(const Singleton<T>&) = delete;  // 注释拷贝构造
    Singleton & operator = (const Singleton<T>& st) = delete;  // 注销赋值构造
    static std::shared_ptr<T> _instance;  // 唯一的实例，并且为静态的，可以使用类名进行调用，并且所有的实例都会返回这个
public:
    // 获取实例的地址
    static std::shared_ptr<T> GetInstance(){
        // 局部变量，只会初始化一次，把安全性交给了once_flag
        static std::once_flag s_flag;
        std::call_once(s_flag, [&](){
            _instance = std::shared_ptr<T>(new T);
            /*
             *  为什么不用 make_shared 而是用 new 呢？
             *  因为构造函数是protected私有的，make_shared无法访问受保护的构造函数，它要求构造函数是 公共的（public）或者至少是 可访问的
             *  而new可以在类的内部直接调用
             */

        });

        return _instance;
    }
    void PrintAddress(){
        // 打印裸指针地址
        std::cout<< _instance.get() << std::endl;
    }

    ~Singleton(){
        std::cout<< "this is singleton destruct" << std::endl;
    }
};

// 静态成员还是需要在外部进行实例化
template <typename T>
std::shared_ptr<T> Singleton<T>::_instance = nullptr;

#endif // SINGLETON_H
